package com.hugang.compare;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * java比较器
 * 1、说明：java中的对象，正常情况下只能进行比较：== 或 !=，不能使用 > 或 < 的方式。
 * java实现对象的比较是通过实现两个接口中的任何一个：Comparable/Comparator
 * 2、Comparable接口的使用(也叫自然排序)：
 * 1）像String、包装类等实现了Comparable接口，重写了compareTo(obj)方法，给出了比较两个对象的具体方式，默认从小到大排列
 * 2）重写compareTo(obj)方法的规则：
 * 如果当前对象this大于形参对象obj，返回正整数
 * 如果当前对象this小于形参对象obj，返回负整数
 * 如果当前对象this等于形参对象obj，返回0
 * 3）对于自定义类，如果需要排序，可以让自定义类实现Comparable接口，重写compareTo(obj)方法，指明如何排序
 *
 * 两种接口使用对比：
 *  1、Comparable接口的方式一旦指定，保证Comparable接口实现类的对象在任何位置都可以比较大小
 *  2、Comparator接口属于临时性比较
 * @author hg
 * @date 2020/6/17 18:35
 */
public class CompareTest {

    public static void main(String[] args) {
        Person p1 = new Person("张三", 26);
        Person p2 = new Person("李四", 25);

        Person[] people = new Person[]{p1, p2};
        Arrays.sort(people);
        System.out.println(people[0].getName());
    }

    /**
     * 实现Comparator接口实现定制排序：String类型默认使用从小到大顺序排序，又不能修改String代码，因此可以使用此方法实现从大到小排序
     */
    @Test
    public void test(){

        String[] arrs = new String[]{"BB","AA","GG","JJ","SS","TT","XX","JJ","II","YY","ZZ"};
        Arrays.sort(arrs, new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return - o1.compareTo(o2);
            }
        });
        System.out.println(Arrays.toString(arrs));
    }
}

class Person implements Comparable {

    private String name;

    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Object o) {
        if (this == o) {
            return 0;
        }
        if (o instanceof Person) {
            Person person = (Person) o;
            return this.age - person.age;
        } else {
            throw new RuntimeException();
        }
    }
}
